Reacti 'use' Hook'i ressursihaldus: ressursside elutsüklite optimeerimine tippjõudluse saavutamiseks | MLOG | MLOG

Selgitus:

Näide 2: WebSocketi ühenduste haldamine

See näide demonstreerib, kuidas hallata WebSocketi ühendust, kasutades 'use' Hook'i ja kohandatud ressursimähist.

            import React, { useState, useEffect, use } from 'react';

const createWebSocketResource = (url) => {
  let socket;
  let status = 'pending';
  let messageQueue = [];
  let listeners = [];

  const connect = () => {
    return new Promise((resolve, reject) => {
      socket = new WebSocket(url);

      socket.onopen = () => {
        status = 'connected';
        resolve();
        // Send queued messages
        messageQueue.forEach(msg => socket.send(msg));
        messageQueue = [];
      };

      socket.onerror = (error) => {
        status = 'error';
        reject(error);
      };

      socket.onmessage = (event) => {
        listeners.forEach(listener => listener(event.data));
      };

      socket.onclose = () => {
        status = 'closed';
        listeners = []; // Clear listeners to avoid memory leaks
      };
    });
  };

  const promise = connect();

  return {
    read() {
      use(promise);
    },
    send(message) {
      if (status === 'connected') {
        socket.send(message);
      } else {
        messageQueue.push(message);
      }
    },
    subscribe(listener) {
      listeners.push(listener);
      return () => {
        listeners = listeners.filter(l => l !== listener);
      };
    },
    close() {
        if (socket && socket.readyState !== WebSocket.CLOSED) {
            socket.close();
        }
    }
  };
};

function WebSocketComponent({ url }) {
  const socketResource = createWebSocketResource(url);
  // Suspend until connected
  socketResource.read();
  const [message, setMessage] = useState('');
  const [receivedMessages, setReceivedMessages] = useState([]);

  useEffect(() => {
    const unsubscribe = socketResource.subscribe(data => {
      setReceivedMessages(prevMessages => [...prevMessages, data]);
    });
    return () => {
        unsubscribe();
        socketResource.close();
    };
  }, [socketResource]);

  const sendMessage = () => {
    socketResource.send(message);
    setMessage('');
  };

  return (
    
setMessage(e.target.value)} />
Received Messages:
    {receivedMessages.map((msg, index) => (
  • {msg}
  • ))}
); } function App() { return ( Connecting to WebSocket...
}> ); } export default App;

Selgitus:

Näide 3: failikäepidemete (File Handles) haldamine

See näide illustreerib ressursihaldust 'use' Hook'iga, kasutades NodeJS-i failikäepidemeid (see töötab ainult NodeJS-i keskkonnas ja on mõeldud ressursi elutsükli kontseptsioonide demonstreerimiseks).

            // This example is designed for a NodeJS environment

const fs = require('node:fs/promises');
import React, { use } from 'react';

const createFileHandleResource = async (filePath) => {
  let fileHandle;

  const openFile = async () => {
    fileHandle = await fs.open(filePath, 'r');
    return fileHandle;
  };

  const promise = openFile();

  return {
    read() {
      return use(promise);
    },
    async close() {
      if (fileHandle) {
        await fileHandle.close();
        fileHandle = null;
      }
    },
    async readContents() {
      const handle = use(promise);
      const buffer = await handle.readFile();
      return buffer.toString();
    }
  };
};


function FileViewer({ filePath }) {
  const fileHandleResource = createFileHandleResource(filePath);
  const contents = fileHandleResource.readContents();

  React.useEffect(() => {
    return () => {
      // Cleanup when the component unmounts
      fileHandleResource.close();
    };
  }, [fileHandleResource]);

  return (
    

File Contents:

{contents}
); } // Example Usage async function App() { const filePath = 'example.txt'; await fs.writeFile(filePath, 'Hello, world!\nThis is a test file.'); return (
); } export default App;

Selgitus:

Täiustatud tehnikad: veapiirid (Error Boundaries), ressursside koondamine (Resource Pooling) ja serverikomponendid

Lisaks põhinäidetele saab 'use' Hook'i kombineerida teiste Reacti funktsioonidega, et rakendada keerukamaid ressursihaldusstrateegiaid.

Veapiirid: vigade sujuv käsitlemine

Veapiirid on Reacti komponendid, mis püüavad kinni JavaScripti vead oma alamkomponentide puus, logivad need vead ja kuvavad varu-kasutajaliidese, selle asemel et kogu komponendipuu kokku kukuks. 'use' Hook'i kasutamisel on ülioluline mähkida oma komponendid veapiiridega, et käsitleda võimalikke vigu andmete pärimisel või ressursi initsialiseerimisel.

            import React, { Component } from 'react';

class ErrorBoundary extends Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // Update state so the next render will show the fallback UI.
    return { hasError: true };
  }

  componentDidCatch(error, errorInfo) {
    // You can also log the error to an error reporting service
    console.error(error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      // You can render any custom fallback UI
      return 

Something went wrong.

; } return this.props.children; } } function App() { return ( Loading...
}> ); }

Ressursside koondamine: ressursside taaskasutuse optimeerimine

Mõnes stsenaariumis võib ressursside sagedane loomine ja hävitamine olla kulukas. Ressursside koondamine hõlmab korduvkasutatavate ressursside kogumi säilitamist, et minimeerida ressursside loomise ja hävitamise üldkulusid. Kuigi 'use' hook ei rakenda olemuslikult ressursside koondamist, saab seda kasutada koos eraldi ressursikogumi rakendamisega.

Mõelge andmebaasi ühenduste kogumile. Selle asemel, et luua iga päringu jaoks uus ühendus, saate säilitada eelnevalt loodud ühenduste kogumi ja neid taaskasutada. 'use' Hook'i saab kasutada ühenduste hankimise ja vabastamise haldamiseks kogumist.

(Kontseptuaalne näide - implementatsioon varieerub sõltuvalt konkreetsest ressursist ja koondamisteegist):

            // Conceptual Example (not a complete, runnable implementation)

import React, { use } from 'react';
// Assume a database connection pool library exists
import { getConnectionFromPool, releaseConnectionToPool } from './dbPool';

const createDbConnectionResource = () => {
  let connection;

  const acquireConnection = async () => {
    connection = await getConnectionFromPool();
    return connection;
  };

  const promise = acquireConnection();

  return {
    read() {
      return use(promise);
    },
    release() {
      if (connection) {
        releaseConnectionToPool(connection);
        connection = null;
      }
    },
    query(sql) {
      const conn = use(promise);
      return conn.query(sql);
    }
  };
};

function MyDataComponent() {
  const dbResource = createDbConnectionResource();

  React.useEffect(() => {
    return () => {
      dbResource.release();
    };
  }, [dbResource]);

  const data = dbResource.query('SELECT * FROM my_table');
  return 
{data}
; }

Reacti serverikomponendid (RSCd): 'use' Hook'i loomulik kodu

'use' Hook loodi algselt Reacti serverikomponentide jaoks. RSCd käivitatakse serveris, mis võimaldab teil andmeid pärida ja muid serveripoolseid toiminguid teha ilma koodi kliendile saatmata. See parandab oluliselt jõudlust ja vähendab kliendipoolse JavaScripti paketi suurust.

RSCdes saab 'use' Hook'i kasutada andmete otse pärimiseks andmebaasidest või API-dest ilma kliendipoolsete pärimisteekide vajaduseta. Andmed päritakse serveris ja tulemuseks olev HTML saadetakse kliendile, kus React selle hüdreerib.

'use' Hook'i kasutamisel RSCdes on oluline olla teadlik RSCde piirangutest, näiteks kliendipoolse oleku ja sündmuste käsitlejate puudumisest. Siiski saab RSCsid kombineerida kliendipoolsete komponentidega, et luua võimsaid ja tõhusaid rakendusi.

Parimad praktikad tõhusaks ressursihalduseks 'use' Hook'iga

Et maksimeerida 'use' Hook'i eeliseid ressursihalduses, järgige neid parimaid praktikaid:

Levinud lõksud ja kuidas neid vältida

Kuigi 'use' Hook pakub arvukalt eeliseid, on oluline olla teadlik võimalikest lõksudest ja kuidas neid vältida.

Kokkuvõte: 'use' Hook'i omaksvõtmine optimeeritud Reacti rakenduste jaoks

Reacti 'use' Hook on märkimisväärne edasiminek ressursihalduses Reacti rakendustes. Lihtsustades asünkroonset andmekäsitlust, automatiseerides ressursside puhastamist ja integreerudes sujuvalt Suspense'iga, annab see arendajatele võimaluse luua jõudlusvõimelisemaid, hooldatavamaid ja kasutajasõbralikumaid rakendusi.

Mõistes põhimõisteid, uurides praktilisi näiteid ja järgides parimaid praktikaid, saate tõhusalt kasutada 'use' Hook'i ressursside elutsüklite optimeerimiseks ja oma Reacti rakenduste täieliku potentsiaali avamiseks. Kuna React areneb edasi, mängib 'use' Hook kahtlemata üha olulisemat rolli ressursihalduse tuleviku kujundamisel Reacti ökosüsteemis.